package com.eedi.framework.dict.service;

import com.eedi.framework.dict.controller.sys.vo.data.SysDictDataResp;
import com.eedi.framework.dict.controller.sys.vo.data.SysDictDataSaveReq;
import com.eedi.framework.dict.dal.dataobject.SysDictDataDO;
import com.eedi.framework.common.enums.CommonStatusEnum;
import com.eedi.framework.common.pojo.PageResult;
import com.eedi.framework.dict.controller.sys.vo.data.SysDictDataPageReq;
import com.eedi.framework.dict.controller.sys.vo.data.SysDictDataUpReq;
import org.springframework.lang.Nullable;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 字典数据 Service 接口
 *
 */
public interface SysDictDataService {

    /**
     * 创建字典数据
     *
     * @param createReqVO 字典数据信息
     * @return 字典数据编号
     */
    String createDictData(SysDictDataSaveReq createReqVO);

    /**
     * 更新字典数据
     *
     * @param updateReqVO 字典数据信息
     */
    void updateDictData(SysDictDataUpReq updateReqVO);

    /**
     * 删除字典数据
     *
     * @param sysDictDataId 字典数据编号
     */
    void deleteDictData(String sysDictDataId);

    /**
     * 获得字典数据列表
     *
     * @param sysDictDataStatus   状态
     * @param sysDictDataType 字典类型
     * @return 字典数据全列表
     */
    List<SysDictDataDO> getDictDataList(@Nullable CommonStatusEnum sysDictDataStatus, @Nullable String sysDictDataType);


    /**
     * 获得字典数据集合
     *
     * @param sysDictDataType 字典类型
     * @return 字典数据全集合
     */
    Map<String,List<SysDictDataResp>> getDictDataMap(@Nullable Set<String>  sysDictDataType);


    /**
     * 获得字典数据集合
     *
     * @param sysDictDataType 字典类型
     * @return 字典数据全集合
     */
    List<SysDictDataResp> getDictDataList(@Nullable Set<String>  sysDictDataType);
    /**
     * 获得字典数据分页列表
     *
     * @param pageReqVO 分页请求
     * @return 字典数据分页列表
     */
    PageResult<SysDictDataDO> getDictDataPage(SysDictDataPageReq pageReqVO);

    /**
     * 获得字典数据详情
     *
     * @param sysDictDataId 字典数据编号
     * @return 字典数据
     */
    SysDictDataDO getDictData(String sysDictDataId);

    /**
     * 获得指定字典类型的数据数量
     *
     * @param dictDataType 字典类型
     * @return 数据数量
     */
    long getDictDataCountByDictType(String dictDataType);

    /**
     * 校验字典数据们是否有效。如下情况，视为无效：
     * 1. 字典数据不存在
     * 2. 字典数据被禁用
     *
     * @param dictDataType 字典类型
     * @param values   字典数据值的数组
     */
    void validateDictDataList(String dictDataType, Collection<String> values);

    /**
     * 获得指定的字典数据
     *
     * @param dictDataType 字典类型
     * @param dictDataValue    字典数据值
     * @return 字典数据
     */
    SysDictDataDO getDictData(String dictDataType, String dictDataValue);

    /**
     * 解析获得指定的字典数据，从缓存中
     *
     * @param dictType 字典类型
     * @param label    字典数据标签
     * @return 字典数据
     */
    SysDictDataDO parseDictData(String dictType, String label);


    List<SysDictDataDO> getDictDataByType(String dictType);

}
